home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / macros / latex209 / contrib / psfrag / ps2frag < prev    next >
Text File  |  1993-10-28  |  5KB  |  143 lines

  1. #!/usr/local/bin/perl
  2. #
  3. # Usage:
  4. #    ps2frag [-x<pts>] [-y<pts>] files...
  5. #
  6. # Ps2frag runs GhostScript on one or more postscript files.  For each
  7. # file argument (eg: "example.ps"), a file with the extension ".frag" is
  8. # written (eg: "example.frag").  The output file contains LaTeX
  9. # source that gives the text, abs bottom-left coordinates, text bounding
  10. # box, and rotation for each piece of text that is displayed by the
  11. # postscript show operators (show, ashow, kshow etc).
  12. #
  13. # The -x and -y arguments can be used to offset the x and y locations
  14. # of each text fragment.  Some programs that write postscript files like
  15. # to offset all text by a small fixed amount.  For example, matlab puts
  16. # text from a text() command 2.28 pts (4 * 0.57) above a plotted line with
  17. # the same coordinates.  Therefore, to convert a matlab postscript file you
  18. # should use
  19. #
  20. #      ps2frag -y -2.28 matlabplot.ps
  21. #
  22. # Similarly, idraw, with grid gravity turned on, puts text a small distance
  23. # above the grid point.  For 12pt fonts the offset is 8.33 pts (it appears to
  24. # be 0.7574 * (fontSize - 1) in general), so to convert an idraw postscript
  25. # file you should use
  26. #
  27. #      ps2frag -y -8.33 idrawfile.ps
  28. #
  29. # (Note that these position corrections are only relevant if you want the
  30. # LaTeX characters to line up exactly with other geometry such as lines etc).
  31. #
  32. # The output file (<file>.frag) is normally included with the
  33. # \epsfbox{} LaTeX marco.  You should include the psfrag and epsfrag
  34. # document styles to make everything work.
  35. #
  36. # Revision History:
  37. #   26-Oct-93   Piet Tutelaers  ported to MSDOS and perlized
  38. #   20-Sep-92   Craig Barratt    Released version 1.1.
  39. #   17-Sep-92   Craig Barratt    Made PS2FRAG settable by user.
  40. #    9-Jun-92   Craig Barratt    Changed egrep to grep for system V users.
  41. #    1-Jun-92   Craig Barratt    Released version 1.0.
  42. #   28-Feb-92   Craig Barratt    Initial version.
  43. #
  44. # Send comments and bugs to Craig Barratt (craig@isl.stanford.edu)
  45. #
  46.  
  47. # Installation: PS2FRAG should point at wherever the ps2frag.ps
  48. # file is installed (eg: set PS2FRAG = /usr/local/lib/ps/ps2frag.ps).
  49. # The "set PS2FRAG" line below should be edited accordingly.
  50. #
  51. # [The user can override this default by setting the environment
  52. #  variable PS2FRAG to point somewhere else; this was suggested
  53. #  by Roque Donizete de Oliveira (oliveria@caen.engin.umich.edu).]
  54. #
  55.  
  56. # Platform dependant code
  57. $UNIX = 1; $verbose = 1;
  58. $SEP = ':' if $UNIX;
  59. $SEP = ';' if $MSDOS;
  60.  
  61. # Use default or user's PS2FRAG environment value
  62. $ENV{'PS2FRAG'} = './ps2frag.ps' unless $ENV{'PS2FRAG'};
  63. die "Can't open $ENV{'PS2FRAG'}\n" unless -r $ENV{'PS2FRAG'};
  64.  
  65. # Verify if we have GhostScript
  66. $GS = 'gs386.exe' if $MSDOS;
  67. $GS = 'gs' if $UNIX; 
  68. $gsfile = &where($ENV{'PATH'}, $GS);
  69. die "$GS: not found in $ENV{'PATH'}\n" unless $gsfile ne '';
  70. ($ENV{'GS_LIB'}) = ($gsfile =~ m#^(.*)[/\\]#) if $MSDOS;
  71.  
  72. $dx = 0;
  73. $dy = 0;
  74.  
  75. do 'getopts.pl';
  76. &Getopts('x:y:') || &usage();
  77. &usage() unless @ARGV;
  78.  
  79. $dx = $opt_x if $opt_x;
  80. $dy = $opt_y if $opt_y;
  81. die "$dx: invalid number\n" unless &valid_number($dx);
  82. die "$dy: invalid number\n" unless &valid_number($dy);
  83.  
  84. foreach (@ARGV) {
  85.    die "Can't open $_\n" unless -r $_;
  86.    warn "$_:  missing '%!' magic code!\n" unless &postscript($_);
  87.    $psfile = $_;
  88.    s/[.].*$/.frag/; $fragfile = $_;
  89.    s/[.].*$/.gs/; $gsout = $_;
  90.    unlink($fragfile) if -r $fragfile;
  91.    print "Running $GS ..." if $verbose;
  92.    open(GS, "|$GS -dNODISPLAY $ENV{'PS2FRAG'} - > $gsout");
  93.    print(GS "$dx $dy ($psfile) FragConvert\n");
  94.    close(GS);
  95.    print " done.\n" if $verbose;
  96.    $error = `grep -s -i Error $gsout` if $gsout;
  97.    if (! -r "$fragfile" || $error) {
  98.       print "$GS failed on '$psfile' (see $gsout) running:\n";
  99.       print "echo \"$dx $dy ($psfile) FragConvert\"",
  100.             " | gs -dNODISPLAY $ENV{'PS2FRAG'} -\n" if $UNIX;
  101.       print "echo $dx $dy ($psfile) FragConvert",
  102.             " | $GS -dNODISPLAY $ENV{'PS2FRAG'} -\n" if $MSDOS;
  103.       exit 1;
  104.    }
  105.    print "$fragfile created\n" if $verbose && $fragfile;
  106.    unlink("$gsout");
  107. }
  108.  
  109. exit 0;
  110.  
  111. sub usage{
  112.     print "Usage: ps2frag [-x<pts>] [-x<pts>] files...\n";
  113.     exit 1;
  114. }
  115.  
  116. sub valid_number{
  117.    local($_) = @_;
  118.    /^-?\d*(\.\d*)?$/? 1: 0;
  119. }
  120.  
  121. sub postscript{
  122.    local($_) = @_;
  123.    open(PS, $_);
  124.    $magic = getc(PS) . getc(PS);
  125.    close(PS);
  126.    $magic eq '%!'? 1: 0;
  127. }
  128.  
  129. #
  130. # Look for a <file> with some possible <extensions> in <path>.
  131. # Return absolute name of <file> when found otherwise empty string.
  132. #
  133. sub where {
  134.    local($path, $file) = @_;
  135.    foreach (split(/$SEP/, $path)) {
  136.       if (-r "$_/$file") {
  137.          return "$_/$file";
  138.       }
  139.    }
  140.    return "";
  141. }
  142.  
  143.